package code19_jdk8.stream;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


public class TestMiddle02 {

	public static void main(String[] args) {
		//f1();
		
		//f2();
		
		//f3();
		
		t1();
	}

	private static void t1() {
		// 统计员工的姓名都使用了哪些英文字母。
		Emp.getData().stream()
		.flatMap( e ->  Arrays.stream(e.getName().split("")) )
		.filter( s -> s.matches("[a-zA-Z]"))
		.distinct()
		.forEach(System.out::println);
		
		System.out.println("-------------");
		List<Emp> data = Emp.getData();
		Set<String> words = new HashSet<String>();// 不重复
		for (Emp e : data) {
			String[] arr = e.getName().split("");
			for (String s : arr) {
				if ( s.matches("[a-zA-Z]") ) {
					words.add(s);
				}
			}
		}
		for (String s : words) {
			System.out.println(s);
		}
	}

	private static void f3() {
		// mapToInt 将流中的每一个元素转换为 int 类型
		// mapToDouble 将流中的每一个元素转换为 double 类型
		// mapToLong 将流中的每一个元素转换为 long 类型
		
		// 输出每一个员工的日薪(按22天计算)
		Emp.getData().stream()
		.mapToDouble( e -> {
			return e.getSal() / 22;
		})
		.forEach(System.out::println);
	}

	private static void f2() {
		// flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
		// 将函数式接口的方法操作应用到每一个元素上, 将其映射成一个新的元素, 并把此元素转换为一个独立的流 返回
		// flatMap 会收集每一个元素映射的 流中的元素, 把它们合并为一个完整的流
		
//		Emp.getData().stream()
//		.map( e -> {
//			// 把姓名转换为 字符数组
//			String[] arr = e.getName().split("");
//			return Arrays.asList(arr);
//		})
//		.forEach(System.out::println);
		
		// 取出所有员工的姓名组成的字母(字符), 要去重
		Emp.getData().stream()
		.flatMap( e -> {
			// 把姓名转换为 字符数组
			String[] arr = e.getName().split("");
			// 把自己的结果 转换为流
			return Arrays.asList(arr).stream();
		})
		.distinct()
		.forEach(System.out::println);
		// flatMap 可以实现元素的合并
	}

	private static void f1() {
		// map(Function<? super T, ? extends R> mapper) 将函数式接口的方法操作应用到每一个元素上，将其映射成一个新的元素。
		// 取出所有员工的姓名, 并输出
		Emp.getData().stream()
		.map( e -> {
			return e.getName();// 只取名称
		})
		.forEach(System.out::println);
	}
	
}
